package demo.reflect;

import java.lang.annotation.*;
import java.lang.reflect.Method;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/8/6-08-06-10:31
 * @Description：demo.reflect
 */
/*
 自定义三个注解：@MyTest ，@MyBefore ，@MyAfter ，并测试使用
要求：
	( 1)无需任何属性，要求三个注解均只能用在方法上，而且作用域范围在运行时.
	( 2)定义一个注解解析类ParseMyAnno，并定义方法parse()
	( 3)方法中，反射解析注解，先运行@MyBefore的方法，再运行@MyTest的方法，最后运行@MyAfter
的方法
 */
public class ParseMyAnno {
    public static void parse(Class c) throws Exception {
        Method[] methods = c.getDeclaredMethods();
        Method method1 =null, method2 =null, method3 = null;
        for (Method method : methods) {
            if(method.isAnnotationPresent(MyTest.class)){
                method2 = method;
            }
            if(method.isAnnotationPresent(MyBefore.class)){
                method1 = method;
            }
            if(method.isAnnotationPresent(MyAfter.class)){
                method3 = method;
            }
        }
        ParseMyAnno test = (ParseMyAnno) c.newInstance();
        if(method1 != null){
            method1.invoke(test,null);
        }
        if(method2 != null){
            method2.invoke(test,null);
        }
        if(method3 != null){
            method3.invoke(test,null);
        }

    }
    @MyBefore
    public void test1(){
        System.out.println("ParseMyAnno.test1");
    }
    @MyTest
    public void test2(){
        System.out.println("ParseMyAnno.test2");
    }
    @MyAfter
    public void test3(){
        System.out.println("ParseMyAnno.test3");
    }

    public static void main(String[] args) throws Exception {
        parse(ParseMyAnno.class);
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyTest{

}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyBefore{

}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAfter{

}